package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputSteam  缓冲输出流  写  bos.txt
 *        BufferedInputSteam   缓冲输入流  读入
 */

public class IOSAPI {

    /**
     * 缓冲输出流：具备功能，合理传输数据 效率提高
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream（低级流引用，size:存字节数组【指定】）
     * 问题1：不能指定字符集
     *     2：不能按照字符读取
     */
    @Test
    public void testBIS(){
        /*//创建低级流
        FileInputStream fis=new FileInputStream("bos.txt");
        //创建高级流---指定字符集---缓冲不具备功能---新【转换流】
        BufferedInputStream bos=new BufferedInputStream(fis,"UTF8");

        /**
         * read()---读：一个字节，字节数组---->专门读文字
         */
        //bos.read();
    }

    /**
     * 高级流
     * 针对于缓冲输出流|入功能上的限定
     * 字符流【转换流】--解决：缓冲输入流读取单位 为字节问题
     * InputSteamReader 读取单位：字符
     * OutputSteamReader 写出单位：字符
     * 需求：重新写流---针对：文字  写出文本：osw.txt
     */
    @Test
    public void testOSW(){
        //标准流：1、置空流
        FileOutputStream fos=null;
        OutputStreamWriter osw=null;
        //标准流：2、捕获异常
        //创建低级流
        try {
            fos = new FileOutputStream("osw.txt");
            //不考虑效率--只传输文本--字符输出流：输出单位字符形式
            //字符流：都可以在构造器第二个参数指定编码集
            osw = new OutputStreamWriter(fos, "UTF8");
            //write（）直接写出文本【不需要将文本转换为字节数组】
            osw.write("金珉奎颜永一");
            osw.write("金珉奎四鸟一\n"); //换行：字符char
            osw.write("奎八金婚");
        }catch (FileNotFoundException e) { //文件不存在
            e.printStackTrace();
        }catch (UnsupportedEncodingException e){ //字符集转换
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭高级流：字符输出流
            if(osw!=null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 高级流【处理流】--转换流，特点：套在低级流上，被其他高级流套上【传输单位：字符】
     * 字符输入流---单元测试：testISR（） 读入  文本【不可以读入字符串】
     * 字符输出流---单元测试：testOSW（） 写出  文本【字符串】
     * InputSteamReader 字符输入流 不可以读入文本
     *
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
     * BufferedReader  缓冲字符输入流--解决：：InputSteamReader读入字节形式
     *                                     BufferedReader读入字符形式
     * ButteredWriter
     *
     * 需求：ISR字符输入流读取 osw.txt 文件
     *      ①当前代码转换为标准流IO：捕获所有异常
     *      ②读取每行文本 readLine（）  提示：不为null代表文本
     *      写出：金珉奎颜永一 金珉奎四鸟一
     */

    @Test
    public void testISR() throws IOException {
            //创建低级流
            FileInputStream fis = new FileInputStream("osw.txt");
            //创建高级流---转换流---字符输入流
            InputStreamReader isr = new InputStreamReader(fis);
            //读 read（）问题：读入数据单位：字节，而不是字符：读字符
            //               转换流----套高级流：缓冲字符输入|出流
            //创建高级流--针对转换流中：字符输入流无法读取形式：字符的情况--缓冲字符输入流
            BufferedReader br = new BufferedReader(isr);
            /**BufferedReader类
             * reaLine（）读入若干字符串，直到读到没有换行符为止
             */
            String line =null;
            //判断条件：文本中一直有内容，一直读，一行文本
            while ((line= br.readLine())!=null){
                System.out.println("打印字符串："+line);
            }
    }

    /**
     * 作业2：读取IOSAPI.java文件--所有代码--写出控制台
     */
    @Test
    public void testHomeWork2() throws IOException {
        //1.创建低级流---读入---找IOSAPI.java  代表路径：File.separator
        //路径：src\main\java\com\tedu\api\io\IOSAPI.java
        FileInputStream fis=new FileInputStream(
                "src"+File.separator+ ""+
                "main"+File.separator+"" +
                "java"+File.separator+""+
                "com"+File.separator+""+
                "tedu"+File.separator+"" +
                "api"+File.separator+"" +
                "io"+File.separator+"IOSAPI.java");
        //2.创建高级流---【读入内容是文本】---转换流---无法读取文本【int】
        InputStreamReader isr = new InputStreamReader(fis);
        //3.创建高级流---缓冲输入流---读取文本
        BufferedReader br = new BufferedReader(isr);
        //4.创建变量：字符串类型--保存每次读取的一行文本
        String line=null; // null代表没有内容【等同于换行】
        //5.一直读入：每行文本保存line中，如果line不为null，一直读
        while ((line= br.readLine())!=null){
            System.out.println("打印字符串："+line);
        }
        //6.关闭高级流
        fis.close();
        isr.close();
        br.close();
    }

    /**
     * BufferedWrite---低配版输出流【缓冲输出流】
     * PrintWrite---高配版输出流【字符输出流】
     * 1.高级流不能直接创建---直接创建【不需要创建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw,txt");
        //高级流：转换流，功能：指定编码集
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：缓冲流，功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流：低级流+转换流+缓冲流
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //写出功能：print（） 打印一行文本 不换行
        //        println（）打印一行文本 换行
        pw.print("金珉奎");
        pw.println("地球球草");
        pw.close();
    }
}
